剛深入解構第三層的原理,接下來可以聊聊第三層最常見的應用-ping,ping可以說是網路工程師最常用到的工具,沒有之一,ping是基於ICMP,也就是第三層IP層header裡的protocol == 1
,那ping可以做什麼呢?既然ping是基於第三層的應用,那他肯定和路由有關,當我們在ping後面的參數放上地址,就能測試對方和本地的主機是不是相通的,如下所示
第一個64 bytes代表傳送ping封包的大小,74.125.24.105
代表藉由DNS server所取得的Google IP,icmp_seq代表發送的順序,用來區別同個packet ID的時候,ttl則是ip header的TIME_TO_LIVE,time則是代表從發送出去到接收過了多少毫秒
我們用我們的網路分析腳本看一下能print出什麼訊息
首先,第二層和第三層的header長度分別為14和20,加起來就是34,icmp的header是8,所以我們取的icmp header段是packet[34:42],icmp_header裡有五個資料icmp_type, code, checksum, packetid, seq = struct.unpack('BbHHh' , icmp_header)
#> ping 172.18.0.3 -c 1
Source Mac: 02:42:ac:12:00:03 Destination Mac: 02:42:ac:12:00:02 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 54951 TTL: 63 Protocol: ICMP Source IP: 172.17.0.5 Destination IP: 172.18.0.3 ICMP Type: 8 Packet ID: 14336 Seq: 256 # ping request,所以ICMP Type = 8
Source Mac: 02:42:ac:11:00:05 Destination Mac: 02:42:ac:11:00:02 Protocol: IPv4 Version: 4 Type of Service: 0 Packet ID: 42293 TTL: 63 Protocol: ICMP Source IP: 172.18.0.3 Destination IP: 172.17.0.5 ICMP Type: 0 Packet ID: 14336 Seq: 256 # ping response,所以ICMP Type = 0
詳見函數_handleICMPPacket,在系列的repo裡https://github.com/kaichiachen/pytcpdump/blob/master/utils/sniffer.py